home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / osrc.arc / AX25DUMP.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-11-22  |  5.8 KB  |  255 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "ax25.h"
  5. #include "timer.h"
  6. #include "lapb.h"
  7. #include "trace.h"
  8.  
  9. char *decode_type();
  10. int16 ftype();
  11. static void netrom_dump();
  12.  
  13. /* Dump an AX.25 packet header */
  14. ax25_dump(bpp,check)
  15. struct mbuf **bpp;
  16. int check;    /* Not used */
  17. {
  18.     char tmp[20];
  19.     char control,pid,seg;
  20.     int16 type;
  21.     struct ax25 hdr;
  22.     struct ax25_addr *hp;
  23.  
  24.     printf("AX25: ");
  25.     /* Extract the address header */
  26.     if(ntohax25(&hdr,bpp) < 0){
  27.         /* Something wrong with the header */
  28.         printf(" bad header!\n");
  29.         return;
  30.     }
  31.     pax25(tmp,&hdr.source);
  32.     printf("%s",tmp);
  33.     pax25(tmp,&hdr.dest);
  34.     printf("->%s",tmp);
  35.     if(hdr.ndigis > 0){
  36.         printf(" v");
  37.         for(hp = &hdr.digis[0]; hp < &hdr.digis[hdr.ndigis]; hp++){
  38.             /* Print digi string */
  39.             pax25(tmp,hp);
  40.             printf(" %s%s",tmp,(hp->ssid & REPEATED) ? "*":"");
  41.         }
  42.     }
  43.     if(pullup(bpp,&control,1) != 1)
  44.         return;
  45.  
  46.     putchar(' ');
  47.     type = ftype(control);
  48.     printf("%s",decode_type(type));
  49.     /* Dump poll/final bit */
  50.     if(control & PF){
  51.         switch(hdr.cmdrsp){
  52.         case COMMAND:
  53.             printf("(P)");
  54.             break;
  55.         case RESPONSE:
  56.             printf("(F)");
  57.             break;
  58.         default:
  59.             printf("(P/F)");
  60.             break;
  61.         }
  62.     }
  63.     /* Dump sequence numbers */
  64.     if((type & 0x3) != U)    /* I or S frame? */
  65.         printf(" NR=%d",(control>>5)&7);
  66.     if(type == I || type == UI){    
  67.         if(type == I)
  68.             printf(" NS=%d",(control>>1)&7);
  69.         /* Decode I field */
  70.         if(pullup(bpp,&pid,1) == 1){    /* Get pid */
  71.             if(uchar(pid) == PID_SEGMENT){
  72.                 pullup(bpp,&seg,1);
  73.                 printf("%s remain %u",seg & SEG_FIRST ?
  74.                  "First seg;" : "",seg & SEG_REM);
  75.                 if(seg & SEG_FIRST)
  76.                     pullup(bpp,&pid,1);
  77.             }
  78.             printf(" pid=");
  79.             switch(uchar(pid)){
  80.             case PID_SEGMENT:
  81.                 break;    /* Already displayed */
  82.             case PID_ARP:
  83.                 printf("ARP\n");
  84.                 arp_dump(bpp);
  85.                 break;
  86.             case PID_NETROM:
  87.                 printf("NET/ROM\n");
  88.                 netrom_dump(bpp);
  89.                 break;
  90.             case PID_IP:
  91.                 printf("IP\n");
  92.                 ip_dump(bpp,pid);
  93.                 break;
  94.             case PID_NO_L3:
  95.                 printf("Text\n");
  96.                 break;
  97.             default:
  98.                 printf("0x%x\n",pid);
  99.             }
  100.         }
  101.     } else if(type == FRMR && pullup(bpp,tmp,3) == 3){
  102.         printf(": %s",decode_type(ftype(tmp[0])));
  103.         printf(" Vr = %d Vs = %d",(tmp[1] >> 5) & MMASK,
  104.             (tmp[1] >> 1) & MMASK);
  105.         if(tmp[2] & W)
  106.             printf(" Invalid control field");
  107.         if(tmp[2] & X)
  108.             printf(" Illegal I-field");
  109.         if(tmp[2] & Y)
  110.             printf(" Too-long I-field");
  111.         if(tmp[2] & Z)
  112.             printf(" Invalid seq number");
  113.         printf("\n");
  114.     } else
  115.         printf("\n");
  116.  
  117. }
  118. /* Display NET/ROM network and transport headers */
  119. static void
  120. netrom_dump(bpp)
  121. struct mbuf **bpp;
  122. {
  123.     struct ax25_addr src,dest;
  124.     char x;
  125.     char tmp[16];
  126.     char thdr[5];
  127.     register i;
  128.  
  129.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  130.         return;
  131.     /* See if it is a routing broadcast */
  132.     if(uchar(*(*bpp)->data) == 0xff) {
  133.         pullup(bpp,tmp,1);        /* Signature */
  134.         pullup(bpp,tmp,ALEN);
  135.         tmp[ALEN] = '\0';
  136.         printf("NET/ROM Routing: %s\n",tmp);
  137.         for(i = 0;i < 11;i++) {
  138.             if (pullup(bpp,tmp,AXALEN) < AXALEN)
  139.                 break;
  140.             memcpy(src.call,tmp,ALEN);
  141.             src.ssid = tmp[ALEN];
  142.             pax25(tmp,&src);
  143.             printf("        %12s",tmp);
  144.             pullup(bpp,tmp,ALEN);
  145.             tmp[ALEN] = '\0';
  146.             printf("%8s",tmp);
  147.             pullup(bpp,tmp,AXALEN);
  148.             memcpy(src.call,tmp, ALEN);
  149.             src.ssid = tmp[ALEN];
  150.             pax25(tmp,&src);
  151.             printf("    %12s", tmp);
  152.             pullup(bpp,tmp,1);
  153.             printf("    %3u\n", uchar(tmp[0]));
  154.         }
  155.         return;
  156.     }
  157.     /* Decode network layer */
  158.     pullup(bpp,tmp,AXALEN);
  159.     memcpy(src.call,tmp,ALEN);
  160.     src.ssid = tmp[ALEN];
  161.     pax25(tmp,&src);
  162.     printf("NET/ROM: %s",tmp);
  163.  
  164.     pullup(bpp,tmp,AXALEN);
  165.     memcpy(dest.call,tmp,ALEN);
  166.     dest.ssid = tmp[ALEN];
  167.     pax25(tmp,&dest);
  168.     printf("->%s",tmp);
  169.  
  170.     pullup(bpp,&x,1);
  171.     printf(" ttl %d\n",uchar(x));
  172.  
  173.     /* Read first five bytes of "transport" header */
  174.     pullup(bpp,thdr,5);
  175.     switch(thdr[4] & 0xf){
  176.      case 0:    /* network PID extension */
  177.          if (uchar(thdr[0]) == PID_IP && uchar(thdr[1]) == PID_IP)
  178.              ip_dump(bpp,1) ;
  179.          else
  180.              printf("         protocol family %x, proto %x",
  181.                      uchar(thdr[0]), uchar(thdr[1])) ;
  182.          break ;
  183.     case 1:    /* Connect request */
  184.         printf("         conn rqst: ckt %d/%d",uchar(thdr[0]),uchar(thdr[1]));
  185.         pullup(bpp,&x,1);
  186.         printf(" wnd %d",x);
  187.         pullup(bpp,(char *)&src,sizeof(struct ax25_addr));
  188.         pax25(tmp,&src);
  189.         printf(" %s",tmp);
  190.         pullup(bpp,(char *)&dest,sizeof(struct ax25_addr));
  191.         pax25(tmp,&dest);
  192.         printf("->%s",tmp);
  193.         break;
  194.     case 2:    /* Connect acknowledgement */
  195.         printf("         conn ack: ur ckt %d/%d my ckt %d/%d",
  196.             uchar(thdr[0]), uchar(thdr[1]), uchar(thdr[2]),
  197.             uchar(thdr[3]));
  198.         pullup(bpp,&x,1);
  199.         printf(" wnd %d",x);
  200.         break;
  201.     case 3:    /* Disconnect request */
  202.         printf("         disc: ckt %d/%d",uchar(thdr[0]),uchar(thdr[1]));
  203.         break;
  204.     case 4:    /* Disconnect acknowledgement */
  205.         printf("         disc ack: ckt %d/%d",uchar(thdr[0]),uchar(thdr[1]));
  206.         break;
  207.     case 5:    /* Information (data) */
  208.         printf("         info: ckt %d/%d",uchar(thdr[0]),uchar(thdr[1]));
  209.         printf(" txseq %d rxseq %d",uchar(thdr[2]), uchar(thdr[3]));
  210.         break;
  211.     case 6:    /* Information acknowledgement */
  212.         printf("         info ack: ckt %d/%d",uchar(thdr[0]),uchar(thdr[1]));
  213.         printf(" txseq %d rxseq %d",uchar(thdr[2]), uchar(thdr[3]));
  214.         break;
  215.     default:
  216.          printf("         unknown transport type %d", thdr[4] & 0x0f) ;
  217.         break;
  218.     }
  219.     if(thdr[4] & 0x80)
  220.         printf(" CHOKE");
  221.     if(thdr[4] & 0x40)
  222.         printf(" NAK");
  223.     printf("\n");
  224. }
  225. char *
  226. decode_type(type)
  227. int16 type;
  228. {
  229.     switch(uchar(type)){
  230.     case I:
  231.         return "I";
  232.     case SABM:
  233.         return "SABM";
  234.     case DISC:
  235.         return "DISC";
  236.     case DM:
  237.         return "DM";
  238.     case UA:
  239.         return "UA";
  240.     case RR:
  241.         return "RR";
  242.     case RNR:
  243.         return "RNR";
  244.     case REJ:
  245.         return "REJ";
  246.     case FRMR:
  247.         return "FRMR";
  248.     case UI:
  249.         return "UI";
  250.     default:
  251.         return "[invalid]";
  252.     }
  253. }
  254.  
  255.